Unity 遇到的一些小问题

这些问题都是工作中遇到的一些问题,现在来总结一下。工作中用到的是UGUI
(随机数的不重复)

  1. Text 首行缩进,使用全角空格(/U3000),还算是一种解决方法。
  2. 在写单例时,注意不要继承Monobehavior,容易出现问题。
  3. Text 在文字赋值后,立刻获取preferredWidth属性,获取的值并不是总是正确的,但在协程中等待当前帧结束获取的值,会比较接近。
    IEnumerator SetTextHeight()
    {
    yieldreturnnew WaitForEndOfFrame();
    var width = ContentText.preferredWidth;
    }

  4. 在ScrollRect拖拽时,怎样判断向上还是向下拖拽?
    OnEndDrag时,得到Content,根据content的LocalPosition的y值判定,>0 是向上拖拽,<0 是向下拖拽。

  5. ScrollView的深入了解
    使用scrollview自动添加垂直项时,使用Vertical Layout Group和content size fitter 两个控件,其中content size fitter 的vertical fit 使用min size
    Vertical Layout Group的child alignment 可以设置排列的对齐。

  6. UGUI 自适应
    Rect Transform 的stretch 可以设置自适应,感觉很好玩。
    shift
    alt
    同时点击shift和alt 又是另一种效果。这里没有截到图,哇,一开始都没注意呢。

  1. 背包的拖拽放置
    背包的拖拽是在网上找到一种方法。
    首先先摆好格子和拖拽项(当然拖拽项也可以动态生成),格子和拖拽项的tag分别设置为Grid 和 Item。
    然后写一个DragAndDrop的代码(名称随意)给拖拽项,其中代码的内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    private static Transform canvasTra;
    private Transform nowParent;//一般来说,物品是格子的子物体,nowParent记录的是当前物品属于哪个格子
    private bool isRaycastLocationValid = true;//默认射线不能穿透物品
    public void OnBeginDrag(PointerEventData eventData)
    {
    if (canvasTra == null) canvasTra = GameObject.Find("Canvas").transform;
    nowParent = transform.parent;
    transform.SetParent(canvasTra);//将当前拖拽的物品置前
    isRaycastLocationValid = false;
    }
    public void OnDrag(PointerEventData eventData)
    {
    transform.position = Input.mousePosition;
    }
    public void OnEndDrag(PointerEventData eventData)
    {
    GameObject go = eventData.pointerCurrentRaycast.gameObject;
    if (go != null)
    {
    //Debug.Log(go.name);
    if (go.tag.Equals("Grid"))//放置到空格子
    {
    SetParentAndPosition(transform, go.transform);
    }
    else if (go.tag.Equals("Item"))//交换位置,注意可能需要把物品下的子物体的Raycast Target关掉
    {
    SetParentAndPosition(transform, go.transform.parent.parent);
    SetParentAndPosition(go.transform.parent, nowParent);
    }
    else
    {
    SetParentAndPosition(transform, nowParent);
    }
    }
    else
    {
    SetParentAndPosition(transform, nowParent);
    }
    isRaycastLocationValid = true;
    }
    private void SetParentAndPosition(Transform child, Transform parent)
    {
    child.SetParent(parent);
    child.position = parent.position;
    }
    public bool IsRaycastLocationValid(Vector2 sp, Camera eventCamera)
    {
    return isRaycastLocationValid;
    }

原理是当拖拽结束时,用射线判断是当前位置的物体的tag是拖拽项(Item)还是格子(Grid),如果是格子直接成为格子的子物体,如果是拖拽项,交换他们的父物体。

坚持原创技术分享,您的支持将鼓励我继续创作!